﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Data;
using NGI_BaseDatos;
using NGI_Entidades;
using NGI_Auxiliares;

namespace NGI_Logica
{
    public class Productos
    {
        public static Producto ObtenerPrecioDeParaUnaCantidadDe(Producto unProducto, Int32 unaCantidad)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intProductoID", unProducto.ID);
            ListadoParametros[0] = new Parametro("@intCantidad", unaCantidad);

            DataTable dt = BaseDatos.Traer("proc_ObtenerPreciosDeProductoSegunCantidad", ListadoParametros);

            if (dt.Rows.Count > 0)
            {
                DataRow dr = dt.Rows[0];
                unProducto.PrecioUnitario = Convert.ToInt32(dr["PecioUnitario"].ToString());
            }
            else
            {
                unProducto.PrecioUnitario = 0;
            }

            return unProducto;
        }


        public static ArrayList CargarTodos(Boolean IncluirInactivos)
        {
            ArrayList ListadoProductos;
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@bitTodos", IncluirInactivos);

            DataTable dt = BaseDatos.Traer("proc_ObtenerProductosExistentesParaListar", ListadoParametros);
            if (dt.Rows.Count == 0)
                return new ArrayList();

            ListadoProductos = new ArrayList();
            foreach (DataRow dr in dt.Rows)
            {
                Producto unProducto = Producto.ParaListar(Convert.ToInt32(dr["ID"].ToString()), dr["Nombre"].ToString());
                ListadoProductos.Add(unProducto);
            }

            return ListadoProductos;
        }

        public static Producto TraerDatosDe(Int32 Id)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intProductoID", Id);

            DataTable dt = BaseDatos.Traer("proc_ObtenerProducto", ListadoParametros);
            if (dt.Rows.Count == 0)
                return new Producto();

            DataRow dr = dt.Rows[0];

            dt = BaseDatos.Traer("proc_ObtenerPreciosPersonalizadosDeUnProducto", ListadoParametros);

            PrecioPersonalizado[] PreciosPersonalizados;
            Producto unProducto;
            if (dt.Rows.Count > 0)
            {
                PreciosPersonalizados = new PrecioPersonalizado[dt.Rows.Count];
                Int32 a = 0;
                foreach (DataRow drPP in dt.Rows)
                {
                    PreciosPersonalizados[a] = PrecioPersonalizado.NuevoPrecioPersonalizado(Convert.ToInt32(drPP["Cantidad"].ToString()), Convert.ToDouble(drPP["PrecioUnitario"].ToString()), Convert.ToBoolean(drPP["Activo"].ToString()));
                    a++;
                }
                unProducto = Producto.ProductoExistente(Convert.ToInt32(dr["Id"].ToString()), dr["Nombre"].ToString(), dr["Descripcion"].ToString(), Convert.ToDouble(dr["PrecioUnitario"].ToString()), Convert.ToBoolean(dr["Activo"].ToString()), PreciosPersonalizados);
            }
            else
            {
                unProducto = Producto.ProductoExistente(Convert.ToInt32(dr["Id"].ToString()), dr["Nombre"].ToString(), dr["Descripcion"].ToString(), Convert.ToDouble(dr["PrecioUnitario"].ToString()), Convert.ToBoolean(dr["Activo"].ToString()));
            }
            
            return unProducto;
        }

        public static void Eliminar(Producto unProducto)
        {

            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intProductoID", unProducto.ID);
            BaseDatos.Ejecutar("proc_EliminarProducto", ListadoParametros);
        }

        public static int Crear(Producto ProductoNuevo, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[5];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@chvNombre", ProductoNuevo.Nombre);
            ListadoParametros[2] = new Parametro("@chvDescripcion", ProductoNuevo.Descripcion);
            ListadoParametros[3] = new Parametro("@fltPrecioUnitario", ProductoNuevo.PrecioUnitario);
            ListadoParametros[4] = new Parametro("@bitActivo", ProductoNuevo.Activo);

            return Convert.ToInt32(BaseDatos.Ejecutar("proc_InsertarProducto", ListadoParametros));
        }

        public static void Modificar(Producto ProductoNuevo, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[6];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@intProductoID", ProductoNuevo.ID);
            ListadoParametros[2] = new Parametro("@chvNombre", ProductoNuevo.Nombre);
            ListadoParametros[3] = new Parametro("@chvDescripcion", ProductoNuevo.Descripcion);
            ListadoParametros[4] = new Parametro("@fltPrecioUnitario", ProductoNuevo.PrecioUnitario);
            ListadoParametros[5] = new Parametro("@bitActivo", ProductoNuevo.Activo);

            BaseDatos.Ejecutar("proc_ModificarProducto", ListadoParametros);
        }

        public static void InsertarPreciosPersonalizados(Producto unProducto, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[5];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@intProductoID", unProducto.ID);

            foreach (PrecioPersonalizado Precio in unProducto.PreciosPersonalizados)
            {
                ListadoParametros[2] = new Parametro("@intCantidad", Precio.Cantidad);
                ListadoParametros[3] = new Parametro("@fltPrecioUnitario", Precio.PrecioUnitario);
                ListadoParametros[4] = new Parametro("@bitActivo", Precio.Activo);
                BaseDatos.Ejecutar("proc_InsertarPrecioPersonalizado", ListadoParametros);
            }
        }

        public static void EliminarPreciosPersonalizados(Producto unProducto)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intProductoID", unProducto.ID);
            BaseDatos.Ejecutar("proc_EliminarPreciosPersonalizadosDeUnProducto", ListadoParametros);
        }

        public static void ObtenerPreciosPersonalizados(Producto unProducto)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intProductoID", unProducto.ID);
            BaseDatos.Ejecutar("proc_ObtenerPreciosPersonalizadosDeUnProducto", ListadoParametros);
        }
    }
}
